package com.example.chamberlainserver.utils;

import com.example.chamberlainserver.dto.PageResult;
import org.springframework.util.CollectionUtils;

import java.util.Collections;
import java.util.List;

/**
 * 分页工具类，用于统一处理分页参数和结果
 */
public class PageUtils {

    /**
     * 默认页码
     */
    private static final int DEFAULT_PAGE_NUM = 1;

    /**
     * 默认每页记录数
     */
    private static final int DEFAULT_PAGE_SIZE = 10;

    /**
     * 最大每页记录数
     */
    private static final int MAX_PAGE_SIZE = 100;

    /**
     * 处理分页参数
     * 
     * @param pageNum 页码
     * @param pageSize 每页记录数
     * @return 处理后的页码和每页记录数的数组，索引0为页码，索引1为每页记录数
     */
    public static int[] handlePageParam(Integer pageNum, Integer pageSize) {
        // 处理页码
        int validPageNum = pageNum == null || pageNum < 1 ? DEFAULT_PAGE_NUM : pageNum;
        
        // 处理每页记录数
        int validPageSize = pageSize == null || pageSize < 1 ? DEFAULT_PAGE_SIZE : pageSize;
        validPageSize = Math.min(validPageSize, MAX_PAGE_SIZE); // 限制最大每页记录数
        
        return new int[]{validPageNum, validPageSize};
    }

    /**
     * 计算分页偏移量
     * 
     * @param pageNum 页码
     * @param pageSize 每页记录数
     * @return 偏移量
     */
    public static int calculateOffset(int pageNum, int pageSize) {
        return (pageNum - 1) * pageSize;
    }

    /**
     * 构建空的分页结果
     * 
     * @param pageNum 页码
     * @param pageSize 每页记录数
     * @param <T> 数据类型
     * @return 空的分页结果
     */
    public static <T> PageResult<T> emptyPage(int pageNum, int pageSize) {
        return new PageResult<>(pageNum, pageSize, 0L, Collections.emptyList());
    }

    /**
     * 构建分页结果
     * 
     * @param pageNum 页码
     * @param pageSize 每页记录数
     * @param total 总记录数
     * @param list 数据列表
     * @param <T> 数据类型
     * @return 分页结果
     */
    public static <T> PageResult<T> buildPageResult(int pageNum, int pageSize, long total, List<T> list) {
        if (CollectionUtils.isEmpty(list)) {
            return emptyPage(pageNum, pageSize);
        }
        return new PageResult<>(pageNum, pageSize, total, list);
    }
}